from pydantic import BaseModel, EmailStr, Field  # 导入Pydantic基础模型和邮箱验证类型
from typing import Optional  # 导入Optional类型，表示可选字段
from datetime import datetime  # 导入日期时间类型


class UserBase(BaseModel):
    """用户基础模式
    
    包含用户的基本信息字段，作为其他用户相关模式的基类
    """
    username: str  # 用户名
    email: EmailStr  # 电子邮箱，会自动验证邮箱格式


class UserCreate(UserBase):
    """用户创建模式
    
    继承自UserBase，用于用户注册时的数据验证
    """
    password: str  # 密码
    confirmPassword: Optional[str] = None  # 确认密码，可选字段


class UserLogin(BaseModel):
    """用户登录模式
    
    用于用户登录时的数据验证
    支持使用用户名或电子邮箱登录
    """
    username: Optional[str] = None  # 用户名
    email: Optional[str] = None  # 电子邮箱
    password: str  # 密码
    remember: Optional[bool] = False  # 是否记住登录状态，默认为False

    class Config:
        # 添加验证器，确保至少提供了username或email其中之一
        @staticmethod
        def validate_model(cls, values):
            if not values.get('username') and not values.get('email'):
                raise ValueError('必须提供用户名或邮箱')
            return values


class UserResponse(UserBase):
    """用户响应模式
    
    继承自UserBase，用于向客户端返回用户信息
    """
    id: int  # 用户ID
    created_at: datetime  # 创建时间
    updated_at: datetime  # 更新时间

    class Config:
        orm_mode = True  # 启用ORM模式，允许从ORM模型直接创建响应对象


class Token(BaseModel):
    """令牌模式
    
    用于向客户端返回JWT令牌信息
    """
    access_token: str  # 访问令牌
    token_type: str  # 令牌类型，通常为"bearer"


class TokenData(BaseModel):
    """令牌数据模式
    
    用于解析JWT令牌中的数据
    """
    username: Optional[str] = None  # 用户名，可选字段 